import Obj, {equalsTo} from "./Obj";
import {hash} from "./Hash";

/**
 * 一个成对出现的对象。
 *
 * 当一个方法需要同时返回两个对象，且该对象总是成对出现时，可以使用此对象进行包装。
 *
 * @param L 位于左侧的值的类型
 * @param R 位于右侧的值的类型
 * @see O
 * @version 1.0
 */
export default class Pair<L, R> extends Obj{

  /**
   * 位于左侧的值。
   *
   * @version 1.0
   */
  public readonly _left: L;

  /**
   * 位于右侧的值。
   *
   * @version 1.0
   */
  public readonly _right: R;

  /**
   * 构造一个成对出现的对象。
   *
   * @param left 位于左侧的值
   * @param right 位于右侧的值
   * @version 1.0
   */
  public constructor(left: L, right: R) {
    super();
    this._left = left;
    this._right = right;
  }


  equals(b: Obj): boolean {
    if (b instanceof Pair) {
      return equalsTo(this._left, b._left) && equalsTo(this._right, b._right);
    }
    return false;
  }

  hashCode(): number {
    return hash(this._left, this._right);
  }
}
